package Main;

import Obj.BgObj;
import Obj.BulletsObj;
import Obj.FlyObj;
import Obj.HeroObj;
import Utils.GameUtils;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

//继承JF类作为游戏开始界面
public class GameBegin extends JFrame {
    //记录游戏状态的变量
    //未开始，运行中，暂停中，结束
    public static int state = 0;
    //初始化全局变量保存英雄机位置
    //全局变量可供访问
    private HeroObj heroObj= new HeroObj(GameUtils.heroImage, 64, 64, 280, 470, 0, this);
    //这两个变量用于控制字弹发射间隔
    private long lastBulletTime = 0;
    private final long bulletInterval = 300;
    //如法炮制
    private long lastFlyTime = 0;
    private final long flyInterval = 1000;

    //敌机对象
    Random random = new Random();
    int flyObjX =random.nextInt(6,750);

    //游戏启动和添加到双缓存调用方法
    public GameBegin() {

        //我方飞机对象
        //开启双缓冲，试试看能不能减小卡顿
        //因为在下面的定时器中需要调用Hero的位置信息，而成员变量无法访问所以重新写了一个全局变量来保存hero的位置
//        HeroObj heroObj = new HeroObj(GameUtils.heroImage, 64, 64, 280, 470, 0, this);
        //背景图片对象
        //y为负值因为图片向下移动所以将背景图片绘制靠上
        BgObj bgobj = new BgObj(GameUtils.bg,  512, 768, 0, 0, 2, this);
        //子弹对象
        BulletsObj bulletsObj = new BulletsObj(GameUtils.bulletImage, 8, 17, heroObj.getX(), heroObj.getY(), 10, this);
        // 使用自定义面板并传入 bgObj
//        这是 JFrame 类的方法，用于设置窗口的内容面板（即主界面的显示区域）。
        setContentPane(new GamePanel(bgobj, heroObj,  bulletsObj));
    }



    //游戏开始方法
    public void launch() {
        //游戏窗口是否可见
        this.setVisible(true);
        //游戏窗口大小
        this.setSize(512, 768);
        //设置游戏窗口位置
        //传入null表示不告诉任何组建位置从而实现屏幕居中
        this.setLocationRelativeTo(null);
        //游戏窗口标题
        this.setTitle("让你上课不好好听熬夜补课吧！");
        //关闭窗口自动结束进程
        //JFrame.EXIT_ON_CLOSE是一个静态常量表示关闭窗口时结束进程
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //鼠标点击事件
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //鼠标点击事件
                //鼠标左键点击
                //state == 0表示我们出于未开始状态
                if (e.getButton() == 1 && state == 0) {
                    state = 1;//游戏开始
                    //重新绘制
                    //用于请求组件重绘自身
                    //重新调用下面的paint()方法
//                    repaint();
                }
            }
        });
        //将while循序写在鼠标点击事件的循环中会阻塞EDT主线程
//        while (true){
//            repaint();
//            //线程休眠
//            try {
//                Thread.sleep(25);
//            } catch (InterruptedException e1) {
//                e1.printStackTrace();
//            }
//        }
        //所以我们使用Timer代替while（true）
        Timer timer = new Timer(25, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();

                //控制子弹发射
                //获取时间戳
                long now = System.currentTimeMillis();
//                如果间隔大雨300毫秒
                if (now - lastBulletTime > bulletInterval && GameBegin.state == 1) {
                    //获取英雄机的xy值
                    int bulletX = heroObj.getX() + heroObj.getWidth() / 2 - 4;
                    int bulletY = heroObj.getY();
                    //创建新的子弹对象
                    BulletsObj bullet = new BulletsObj(
                            GameUtils.bulletImage, 8, 17,
                            bulletX, bulletY,
                            10,
                            GameBegin.this
                    );
                    //添加到集合
                    ((GamePanel) getContentPane()).addObj(bullet);
                    //更新上次发射时间
                    lastBulletTime = now;
                }
                if (now - lastFlyTime > flyInterval && GameBegin.state == 1) {
                    System.out.println("敌机成功创建");
                    int flyObjX =random.nextInt(6,750);
                    FlyObj flyObj = new FlyObj(GameUtils.flyImage, 64, 64, flyObjX, 0, 7, GameBegin.this);
                    ((GamePanel) getContentPane()).addObj(flyObj);
                    lastFlyTime = now;
                }

            }
        });
        timer.start();
    }


//    @Override
//    public void paint(Graphics g) {
//        //绘制背景图片
//        //x=0,y=0表示图片左上角在窗口的左上角,左上角即为“原点”
//        if (state == 0) {
//            g.drawImage(Utils.GameUtils.bg, 0, 0, null);
//            //绘制爱心
//            g.drawImage(Utils.GameUtils.heartImage, 270, 350, null);
//            //绘制英雄
//            g.drawImage(Utils.GameUtils.heroImage, 280, 470, null);
//            //绘制boss
//            g.drawImage(Utils.GameUtils.bossImage, 120, 70, null);
//            //绘制游戏开始界面文字
//            g.setColor(Color.red);
//            g.setFont(new Font("微软雅黑", Font.BOLD, 50));
//            g.drawString("点击鼠标开始游戏", 80, 670);
//        }
//        if (state == 1) {
//
//            bgobj.paintSelf(g);
//        }
//    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(()->{
        GameBegin gameBegin = new GameBegin();
        gameBegin.launch();
        });
    }
}

